from django.shortcuts import render,redirect
from django.http import HttpResponse,JsonResponse
from datetime import datetime,timedelta
from django.template import loader,RequestContext#针对模板使用
from p.models import user
from django.urls import reverse#需要先下载reverse反向解析包
# Create your views here.
def login_required(view_func):
    """自定义登录装饰器"""
    def wrapper(request,*view_args,**view_kwargs):
        """定义一个闭包函数 调用视图"""
        if request.session.has_key('islogin'):
            #用户已登录,调用对应视图
            return view_func(request,*view_args,**view_kwargs)
        else:
            return redirect('/login')
    return wrapper



def uumei(request):
    return render(request,'p/index.html')
def niubi(request):
    return JsonResponse({"status":"200","code":"sucess"})
def guanjianzi(request,num):
    return HttpResponse(num)
def login(request):
    '''登录'''
    #获取cookie username password
    if request.session.has_key('islogin'):#判断是否有这个字段
        return redirect('/change_pwd')#跳转到修改密码页面
    else:
        if 'username' in request.COOKIES:
            username=request.COOKIES['username']
        else:
            username=''
        if 'password' in request.COOKIES:
            password = request.COOKIES['password']
        else:
            password = ''
        return render(request,'p/login.html',{'username':username,'password':password})
def login_check(request):
    '''登录校验'''
    username=request.POST.get('username')
    password=request.POST.get('password')
    remember=request.POST.get('remember')
    #获取验证码
    vcode1=request.POST.get('vcode')#获取用户输入验证码
    vcode2=request.session.get('verifycode')#获取session中保存的验证码
    #2.进行验证码校验
    if vcode1!=vcode2:
        return redirect('/login')
    if username=='admin' and password=='132576330':
        response=redirect('/change_pwd')#跳转到修改密码页面
        if remember=='on':
            response.set_cookie('username',username,expires=datetime.now()+timedelta(days=14))#设置cookie过期时间两周
            response.set_cookie('password', password, expires=datetime.now() + timedelta(days=14))  # 设置密码 可以设置很多个set_cookie
        # return redirect('/uumei')#重定向 记住示列用
        #记录用户登录状态 session
        request.session['islogin']=True#设置记录 只要session里面有islogin这个值 自定义的值
        request.session['username']=username#记录登录用户名
        return response
    else:
        return redirect('/login')

def ajax_test(request):
    '''显示ajax页面'''
    return render(request,'p/test_ajax.html')
def ajax_handle(request):
    return JsonResponse({'res':1})

def login_ajax(request):
    '''显示ajax登录页面'''
    return render(request,'p/login_ajax.html')

def login_ajax_check(request):
    username = request.POST.get('username')
    password = request.POST.get('password')
    if username == 'admin' and password == '132576330':
        return JsonResponse({'res':1})
    else:
        return JsonResponse({'res':0})

def set_cookie(request):
    """设置cookie 跟上面login里面的配置无关"""
    response=HttpResponse("设置cookie")
    # response.set_cookie('num',1,max_age=14*24*3600)#max_age设置过期时间两周
    response.set_cookie('num', 1, expires=datetime.now()+timedelta(days=14))  # max_age设置过期时间两周
    return response
def get_cookie(request):
    """获取cookie的信息"""
    num=request.COOKIES['num']#取出num的值
    return HttpResponse(num)

def set_session(request):
    """设置session--先设置再获取 有改变就要重新页面执行一次接口"""
    request.session['username']='admin'
    request.session['password']='132576330'
    # request.session.set_expiry(5)#设置session过期时间 不设置默认两周过期
    return HttpResponse("设置session")
def get_session(request):
    """获取session 数据会存放到django自带的session表"""
    username=request.session['username']
    password=request.session['password']
    return HttpResponse(username+':'+password)

def clear_session(request):
    """清除session 删除值的部分 """
    # request.session.clear()#清除值的部分
    request.session.flush()#删除整个数据
    return HttpResponse('清除OK')

def index(request):
    """下面的一坨操作 都是django封装好的render一下解决的"""
    #1.加载模板文件，获取一个模板对象
    temp=loader.get_template('p/moban.html')
    #2.定义模板上下文,给模板文件传数据
    context={}#传字典数据 不传就给空
    #3.模板渲染。产生一个替换后的html内容
    res_html=temp.render(context)
    #4.返回给浏览器
    return HttpResponse(res_html)

def temp_var(request):
    """模板列子"""
    my_dict={"haihai":121,"niubi":"是的"}
    my_list=[1,2,5,6]
    username=user.objects.get(id=1)
    context={"my_dict":my_dict,"my_list":my_list,"username":username}
    return render(request,'p/temp_var.html',context)

def temp_tags(request):
    """模板标签"""
    #查询所有用户信息
    username=user.objects.all()
    context={"username":username}
    return render(request,'p/temp_tags.html',context)

def temp_filter(request):
    """模板过滤器"""
    #查询所有用户信息
    username=user.objects.all()
    context={"username":username}
    return render(request,'p/temp_filter.html',context)

def base(request):
    """模板继承"""
    return render(request,'p/base2.html')

def html_escape(request):
    """html转义"""
    return render(request,'p/html_escape.html',{'content':'<h1>hello</h1>','haihai':'<h1>666</h1>','lihai':'<h1>腻害</h1>'})

# def change_pwd(request):
#     """显示修改密码页面 加判断是否登录 因为有些页面需要登录之后才能访问 但如果每个都判断一次很麻烦 就用装饰器"""
#     if request.session.has_key('islogin'):
#         return render(request,'p/change_pwd.html')
#     else:
#         return redirect(request,'/login')

@login_required
def change_pwd(request):
    """显示修改密码页面"""
    return render(request,'p/change_pwd.html')

@login_required
def change_pwd_action(request):
    """模拟修改密码处理"""
    #1.获取新密码
    pwd=request.POST.get('pwd')#这个是通过html里面pwd获取
    username=request.session.get('username')#获取用户名 这个是通过session设置获取
    #2.实际开发得时候：修改对应数据库的内容
    return HttpResponse('%s修改密码为:%s'%(username,pwd))

from PIL import Image, ImageDraw,ImageFont #下载pip install pillow
from six import  BytesIO#可能需要下载pip install django-haystack==3.0b2
def verify_code(request):
    #引入随机函数模块
    import random
    #定义变量，用于画面的背景色、宽、高
    bgcolor=(random.randrange(20,100),random.randrange(20,100),255)
    width=100
    height=25
    #创建画面对象
    im=Image.new('RGB',(width,height),bgcolor)


    #创建画笔对象
    draw=ImageDraw.Draw(im)
    #调用画笔的point()函数绘制噪点
    for i in range(0,100):
        xy=(random.randrange(0,width),random.randrange(0,height))
        fill=(random.randrange(0,255),255,random.randrange(0,255))
        draw.point(xy,fill=fill)
        #定义验证码的备选值
        str1='ABCD123EFGHIJK456LMNOPQRS789TUVWXYZ0'
        #随机选取4个值作为验证码
        rand_str=''
        for i in range(0,4):
            rand_str +=str1[random.randrange(0,len(str1))]
        font=None
        #构建字体颜色
        fontcolor=(255,random.randrange(0,255),random.randrange(0,255))
        #绘制4个字
        draw.text((5,2),rand_str[0],font=font,fill=fontcolor)
        draw.text((25, 2), rand_str[1], font=font, fill=fontcolor)
        draw.text((50, 2), rand_str[2], font=font, fill=fontcolor)
        draw.text((75, 2), rand_str[3], font=font, fill=fontcolor)
        #释放画笔
        del draw
        #存入session 用于做进一步验证
        request.session['verifycode']=rand_str
        #内存文件操作
        buf=BytesIO()
        #将图片保存在内存中，文件类型为png
        im.save(buf,'png')
        #将内存中的图片数据返回给客户端MIME类型为图片png
        return HttpResponse(buf.getvalue(),'image/png')

# 调用验证码
def verify_show(request):
    return render(request, 'verify_show.html')

def url_reverse(request):
    """URL反向解析页面"""
    return render(request,'p/url_reverse.html')

def show_args(request,a,b):
    """捕获位置参数"""
    return HttpResponse(a+':'+b)

def show_kwargs(request,c,d):
    """捕获关键字"""
    return HttpResponse(c + ':' + d)

def url_rever(request):
    """重定向反向解析"""
    # url=reverse('p:uumei')
    url2=reverse('p:show_args',args=(1,2))
    return redirect(url2)

def static_test(request):
    """静态文件图片显示"""
    return render(request,'p/static_test.html')